package com.titan.core.utils.file;

import java.io.File;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.RuntimeMXBean;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Properties;

import com.titan.core.utils.data.AssertUtils;
import com.titan.core.utils.data.StringUtils;
import com.titan.core.utils.io.ConsoleUtils;


/**
 * @author 周成功
 * @email 86898837@qq.com
 * @date 2020年02月20日
 */
public class SystemUtils {
	/***** Java运行时环境信息 *****/
	// Java 运行时环境规范名称
	public final static String SPECIFICATION_NAME = "java.specification.name";
	// Java 运行时环境版本
	public final static String VERSION = "java.version";
	// Java 运行时环境规范版本
	public final static String SPECIFICATION_VERSION = "java.specification.version";
	// Java 运行时环境供应商
	public final static String VENDOR = "java.vendor";
	// Java 运行时环境规范供应商
	public final static String SPECIFICATION_VENDOR = "java.specification.vendor";
	// Java 供应商的 URL
	public final static String VENDOR_URL = "java.vendor.url";
	// Java 安装目录
	public final static String HOME = "java.home";
	// 加载库时搜索的路径列表
	public final static String LIBRARY_PATH = "java.library.path";
	// 默认的临时文件路径
	public final static String TMPDIR = "java.io.tmpdir";
	// 要使用的 JIT 编译器的名称
	public final static String COMPILER = "java.compiler";
	// 一个或多个扩展目录的路径
	public final static String EXT_DIRS = "java.ext.dirs";

	/***** Java虚拟机信息 *****/
	// Java 虚拟机实现名称
	public final static String VM_NAME = "java.vm.name";
	// Java 虚拟机规范名称
	public final static String VM_SPECIFICATION_NAME = "java.vm.specification.name";
	// Java 虚拟机实现版本
	public final static String VM_VERSION = "java.vm.version";
	// Java 虚拟机规范版本
	public final static String VM_SPECIFICATION_VERSION = "java.vm.specification.version";
	// Java 虚拟机实现供应商
	public final static String VM_VENDEOR = "java.vm.vendor";
	// Java 虚拟机规范供应商
	public final static String VM_SPECIFICATION_VENDOR = "java.vm.specification.vendor";

	/***** Java类信息 *****/
	// Java 类格式版本号
	public final static String CLASS_VERSION = "java.class.version";
	// Java 类路径
	public final static String CLASS_PATH = "java.class.path";

	/***** OS信息 *****/
	// 操作系统的名称
	public final static String OS_NAME = "os.name";
	// 操作系统的架构
	public final static String OS_ARCH = "os.arch";
	// 操作系统的版本
	public final static String OS_VERSION = "os.version";
	// 文件分隔符（在 UNIX 系统中是“/”）
	public final static String FILE_SEPRATOR = "file.separator";
	// 路径分隔符（在 UNIX 系统中是“:”）
	public final static String PATH_SEPRATOR = "path.separator";
	// 行分隔符（在 UNIX 系统中是“\n”）
	public final static String LINE_SEPRATOR = "line.separator";

	/***** 用户信息 *****/
	// 用户的账户名称
	public final static String USER_NAME = "user.name";
	// 用户的主目录
	public final static String USER_HOME = "user.home";
	// 用户的当前工作目录
	public final static String USER_DIR = "user.dir";

	/**
	 * 获得System属性（调用System.getProperty）
	 * 
	 * @param key 属性名
	 * @param defaultValue 默认值
	 * @return 值
	 */
	public static String get(final String key, String defaultValue) {
		if (StringUtils.isEmpty(key)) {
			return defaultValue;
		}

		String value = null;
		if (null == System.getSecurityManager()) {
			value = System.getProperty(key);
		} else {
			value = AccessController.doPrivileged(new PrivilegedAction<String>(){
				@Override
				public String run() {
					return System.getProperty(key);
				}
			});
		}

		if (value==null) {
			return defaultValue;
		}

		return value;
	}

	/**
	 * 获得System属性（调用System.getProperty）
	 * 
	 * @param key 键
	 * @return 属性值
	 */
	public static String get(String key) {
		return get(key, null);
	}
	
	
	/**
	 * @return 属性列表
	 */
	public static Properties props() {
		Properties props = null;
		if (null == System.getSecurityManager()) {
			props = System.getProperties();
		} else {
			props = AccessController.doPrivileged(new PrivilegedAction<Properties>(){
				@Override
				public Properties run() {
					return System.getProperties();
				}
			});
		}
		return props;
	}
	
    /**
     * 从操作系统环境变量中获得主机名
     * 例如：  DESKTOP-8P50BP7
     */
    public static String getHostName() {
        return org.apache.commons.lang3.SystemUtils.getHostName();
    }
    /**
     * Gets the Java home directory as a {@code File}.
     * 当前被执行的JAVA所在根目录。
     * 例如： D:\runtime\java\jdk-8u141-x64\jre
     */
    public static File getJavaHome() {
        return org.apache.commons.lang3.SystemUtils.getJavaHome();
    }	
    /**
     * Gets the Java IO temporary directory as a {@code File}.
     * Java临时目录
     * 例如： C:\Users\zzz\AppData\Local\Temp
     */
    public static File getJavaIoTmpDir() {
        return org.apache.commons.lang3.SystemUtils.getJavaIoTmpDir();
    }
    public static String getJavaLibraryPath() {
        return get("java.library.path");
    }    
    /**
     * Gets the user directory as a {@code File}.
     * 当前运行应用所在home目录
     * 例如：D:\我的项目\项目-开发平台\Workspace\titan-demo-jdk
     */
    public static File getUserDir() {
        return org.apache.commons.lang3.SystemUtils.getUserDir();
    }    
    /**
     * Gets the user home directory as a {@code File}.
     * 当前操作系统用户home目录   
     * 例如： C:\Users\zzz
     */
    public static File getUserHome() {
        return org.apache.commons.lang3.SystemUtils.getUserHome();
    }
    
    
    @SuppressWarnings("unused")
    private static void $$__MXBean相关________________________________________________() {}
    private final static RuntimeMXBean MXBEAN_RUNTIME = ManagementFactory.getRuntimeMXBean();
    
    /**
     * 获得当前JVM的进程ID
     * @return
     */
    public static String getProcessId() {
        return MXBEAN_RUNTIME.getName().split("@")[0];
    }
    
    // 获得CPU的核数
    public static int getProcessors() {
        try {
            return Runtime.getRuntime().availableProcessors();
        } catch (Exception e) {
            e.printStackTrace();
            return 1;
        }
    }
    
    
    private final static MemoryMXBean MXBEAN_MEMORY = ManagementFactory.getMemoryMXBean();
    // 获得堆内存的使用量
    public static long getMemoryHeapUsage() {
        return MXBEAN_MEMORY.getHeapMemoryUsage().getUsed();
    }
    // units 最少的单位数量
    public static String getMemoryHeapUsage(int units) {
        AssertUtils.assertTrue(units>0, "输入参数units必须大于0。");
        long value = getMemoryHeapUsage();
//        ConsoleUtils.log(value);
        if(value<1024) {
            return value + "B";
        }
        if(value<1024L*1024L) {
            long valueK = value / 1024;
            long valueB = value - valueK*1024;
            if(units==1) {
                return valueK + "K";
            } else {
                return StringUtils.append(valueK, "K, ", valueB, "B");
            }
        }
        if(value<1024L*1024L*1024L) {
            long valueM = value / (1024*1024);
            long valueK = (value - valueM*1024*1024) / 1024;
            long valueB = value - valueM*1024*1024 - valueK*1024;
            if(units==1) {
                return valueM + "M";
            } else if(units==2) {
                return StringUtils.append(valueM, "M, ", valueK, "K");
            } else {
                return StringUtils.append(valueM, "M, ", valueK, "K, ", valueB, "B");
            }
        }
        long valueG = value / (1024*1024*1024);
        long valueM = (value - valueG*1024*1024*1024) / (1024*1024);
        long valueK = (value - valueG*1024*1024*1024 - valueM*1024*1024) / 1024;
        long valueB = value - valueG*1024*1024*1024 - valueM*1024*1024 - valueK*1024;
        if(units==1) {
            return valueG + "G";
        } else if(units==2) {
            return StringUtils.append(valueG, "G, ", valueM, "M");
        } else if(units==3) {
            return StringUtils.append(valueG, "G, ", valueM, "M, ", valueK, "K");
        }
        return StringUtils.append(valueG, "G, ", valueM, "M, ", valueK, "K, ", valueB, "B");
    }
    
}
